package com.aol.micro.server.s3.data;
import static org.coursera.metrics.datadog.DatadogReporter.Expansion.*;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Optional;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import cyclops.control.Try;
import cyclops.function.FluentFunctions;
import org.apache.commons.io.FileUtils;
import org.coursera.metrics.datadog.DatadogReporter;
import org.coursera.metrics.datadog.transport.HttpTransport;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.model.UploadResult;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import lombok.extern.slf4j.Slf4j;
import repeat.Repeat;
import repeat.RepeatRule;
@Slf4j
public class S3UploadSystemTest{
private static final String BUCKET = System.getProperty("s3.bucket");
private static final Optional<byte[]> nullableFile;
private static TransferManager manager;
private static File tmpDir;
private static Random r;
private static MetricRegistry metricsRegistry = SharedMetricRegistries.getOrCreate("default");
private final Histogram unencryptedHist = getHistogram("com.aol.micro.server.s3.test.latency.unencrypted");
private final Histogram aes256Hist = getHistogram("com.aol.micro.server.s3.test.latency.aes256");
static {
nullableFile = createNullableFile();
assertTrue(nullableFile.isPresent());
manager = createManager();
tmpDir = new File(
System.getProperty("java.io.tmpdir"));
r = new Random();
}
private static Histogram getHistogram(String meterName) {
return metricsRegistry.histogram(MetricRegistry.name(S3UploadSystemTest.class, meterName));
}
private static Optional<byte[]> createNullableFile() {
final File file = new File(
System.getProperty("test.file.full.path"));
Try<byte[], Throwable> loadFileOperation = Try.of(1, Throwable.class)
.map(FluentFunctions.ofChecked(i -> {
return FileUtils.readFileToByteArray(file);
}));
loadFileOperation.onFail(e -> log.error(e.getMessage()));
Optional<byte[]> nFile = Optional.ofNullable(loadFileOperation.get());
return nFile;
}
private static TransferManager createManager() {
AWSCredentials credentials = new AWSCredentials() {
@Override
public String getAWSAccessKeyId() {
return System.getProperty("s3.accessKey");
}
@Override
public String getAWSSecretKey() {
return System.getProperty("s3.secretKey");
}
};
return new TransferManager(
credentials);
}
@BeforeClass
public static void setupMetrics() {
EnumSet<DatadogReporter.Expansion> expansions = EnumSet.of(COUNT, RATE_1_MINUTE, RATE_15_MINUTE, MEDIAN, MEAN,
P95, P99);
HttpTransport httpTransport = new HttpTransport.Builder().withApiKey(System.getProperty("datadog.key"))
.build();
DatadogReporter.Builder builder = DatadogReporter.forRegistry(metricsRegistry)
.withTransport(httpTransport)
.withExpansions(expansions)
.withTags(Arrays.asList("stage:dev"));
DatadogReporter reporter = builder.build();
int reportPeriod = 5;
TimeUnit reportUnit = TimeUnit.valueOf("SECONDS");
log.info("Reporting to datadog every {} {}", 5, reportUnit);
reporter.start(reportPeriod, reportUnit);
}
@Rule
public RepeatRule rule = new RepeatRule();
@Test
@Ignore
@Repeat(times = 1, threads = 4)
public void upload() {
S3ObjectWriter writerWithoutEncryption = buildWriterWithEncryption(false);
long startNE = System.currentTimeMillis();
Try<UploadResult, Throwable> uploadWithoutEncryption = writerWithoutEncryption.putSync("uploadWithoutEncryption" + r.nextLong(), nullableFile.get());
long endNE = System.currentTimeMillis();
assertTrue(uploadWithoutEncryption.isSuccess());
unencryptedHist.update(endNE - startNE);
S3ObjectWriter writerWithEncryption = buildWriterWithEncryption(true);
long startWE = System.currentTimeMillis();
Try<UploadResult, Throwable> uploadWithEncryption = writerWithEncryption.putSync("uploadWithEncryption" + r.nextLong(), nullableFile.get());
assertTrue(uploadWithEncryption.isSuccess());
long endWE = System.currentTimeMillis();
aes256Hist.update(endWE - startWE);
}
private S3ObjectWriter buildWriterWithEncryption(boolean aesEncryption) {
return new S3ObjectWriter(
manager, BUCKET, tmpDir, aesEncryption);
}
}